package com.bq.server.base;

import lombok.Data;

/**
 * 封装接口响应
 */
@Data
public class Result<T> implements R<T> {
    private static final long serialVersionUID = -3130205959309323917L;

    /**
     * 默认失败代码
     */
    public static final int CODE_DEFAULT_FAILURE = 1;

    /**
     * 成功标识
     */
    private boolean ok;
    /**
     * 返回代码
     */
    private int code;

    /**
     * 返回信息
     */
    private String message;

    /**
     * 返回结果
     */
    private T data;


    @Override
    public boolean ok() {
        return getOk();
    }

    public boolean getOk() {
        return ok;
    }

    public void setOk(boolean ok) {
        this.ok = ok;
    }

    @Override
    public int code() {
        return code;
    }

    @Override
    public T data() {
        return getData();
    }

    @Override
    public String message() {
        return message;
    }


    @Override
    public Result<T> code(int code) {
        setCode(code);
        setOk(SUCCESS == code);
        return this;
    }

    @Override
    public Result<T> data(T data) {
        setData(data);
        return this;
    }

    @Override
    public Result<T> message(String message) {
        setMessage(message);
        return this;
    }

    /**
     * 成功结果
     *
     * @param <T> 类型
     * @return 结果
     */
    public static <T> Result<T> success() {
        return new Result<T>()
                .code(SUCCESS);
    }

    /**
     * 成功结果
     *
     * @param data 内容
     * @param <T>  类型
     * @return 结果
     */
    public static <T> Result<T> success(T data) {
        return new Result<T>()
                .code(SUCCESS)
                .data(data);
    }

    /**
     * 失败结果
     *
     * @param code    错误代码
     * @param message 错误说明
     * @param <T>     类型
     * @return 结果
     */
    public static <T> Result<T> failure(int code, String message) {
        return new Result<T>()
                .code(code)
                .message(message);
    }

    /**
     * 失败结果
     *
     * @param message 错误说明
     * @param <T>     类型
     * @return 结果
     */
    public static <T> Result<T> failure(String message) {
        return failure(FAILURE, message);
    }


}
